home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / BlizKick.lha / BlizKick / Modules / QuickBoot.ASM < prev    next >
Assembly Source File  |  2000-09-04  |  4KB  |  224 lines

  1. ; FILE: Source:modules/QuickBoot.ASM          REV: 3 --- QuickBoot module
  2.  
  3. ;
  4. ; QuickBoot module for BlizKick 1.20+
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ; Written by Harry "Piru" Sintonen.
  7. ; This source code is Public Domain.
  8. ;
  9. ; As I decided to drop QUICKBOOT feature from BlizKick 1.20
  10. ; and after getting some requests about getting this feature
  11. ; back, I decided to code it as a external module.
  12. ;
  13. ; Implementation note: Currently supports Blizzard 1230-II,
  14. ; -III, and -IV / Blizzard 1240 / Blizzard 1260. No guaratees
  15. ; that every card supports this though.
  16. ;
  17. ; V1.2 - 5th Aug 2000
  18. ; Fucked up if the module patch was installed inside ROM. Fixed.
  19. ;
  20. ;    - Piru
  21. ;
  22.  
  23.     incdir    "include:"
  24.     include    "exec/types.i"
  25.     include    "exec/memory.i"
  26.     include    "exec/execbase.i"
  27.  
  28.     include    "blizkickmodule.i"
  29.  
  30.  
  31.     SECTION    PATCH,CODE
  32. _DUMMY_LABEL
  33.     BK_PTC
  34.  
  35. ; Code is run with following incoming parameters:
  36. ;
  37. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  38. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  39. ; d0=ROM lenght in bytes    eg. $00080000
  40. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  41. ;    CALL: jsr (a2)
  42. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  43. ;     OUT: d0=ptr to resident (buf) or NULL
  44. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  45. ;    CALL: jsr (a3)
  46. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  47. ;     OUT: d0=success
  48. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  49. ;    CALL: jsr (a4)
  50. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  51. ;     OUT: -
  52. ; d6=dosbase, a6=execbase
  53. ;
  54. ; Code should return:
  55. ;
  56. ; d0=true if succeeded, false if failed.
  57. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  58.  
  59.     moveq    #0,d7
  60.  
  61.     cmp.w    #37,($C,a0)        ;requires V37+ rom image
  62.     blo    .exit
  63.  
  64.     lea    (regs,pc),a5
  65.     movem.l    d0/a0-a4,(a5)
  66.  
  67.     ; find the blizzard card
  68.  
  69.     lea    (expname,pc),a1
  70.     moveq    #37,d0
  71.     jsr    (-$228,a6)        ; OpenLibrary
  72.     move.l    d0,d5
  73.     beq    .exit
  74.  
  75.     lea    (table,pc),a2
  76. .loop    move.w    (a2)+,d0
  77.     bmi.b    .done
  78.     move.w    (a2)+,d1
  79.     sub.l    a0,a0
  80.     exg    d5,a6
  81.     jsr    (-$48,a6)        ; FindCondigDev
  82.     exg    d5,a6
  83.     tst.l    d0
  84.     beq.b    .loop
  85.  
  86.     move.w    -(a2),_BoardNum
  87. .done
  88.     move.l    d5,a1
  89.     jsr    (-$19e,a6)        ; CloseLibrary
  90.  
  91.     move.w    (_BoardNum,pc),d0
  92.     beq    .nocard
  93.  
  94.  
  95.  
  96.     ; find exec.library resident tag
  97.  
  98.     move.l    (LN_NAME,a6),a1
  99.     movem.l    (regs,pc),d0/a0
  100.     move.l    (findresident,pc),a2
  101.     jsr    (a2)
  102.     tst.l    d0
  103.     beq    .exit
  104.  
  105.     move.l    d0,a3
  106.     move.l    (RT_INIT,a3),d1
  107.  
  108.     ; d1 = RT_INIT address
  109.     ; fix our code to jump here when done
  110.  
  111.     lea    (jumpaddr,pc),a1
  112.     move.l    d1,(a1)
  113.  
  114.     ; install patch module
  115.  
  116.     lea    (_quickboot_module,pc),a1
  117.     movem.l    (regs,pc),d0/a0
  118.     move.l    (installmodule,pc),a2
  119.     jsr    (a2)
  120.     tst.l    d0
  121.     beq.b    .exit
  122.  
  123.     ; find ourself
  124.  
  125.     lea    (_name,pc),a1
  126.     movem.l    (regs,pc),d0/a0
  127.     move.l    (findresident,pc),a2
  128.     jsr    (a2)
  129.     tst.l    d0
  130.     beq.b    .exit
  131.  
  132.     ; fix RT_INIT to jump our patch code
  133.  
  134.     move.l    d0,a0
  135.     ; (RT_INIT,a0) gives us pointer to RT_INIT as logical address
  136.     moveq    #_earlycode-_init,d0
  137.     add.l    (RT_INIT,a0),d0
  138.     move.l    d0,(RT_INIT,a3)
  139.  
  140.     ; all done, return success
  141.  
  142.     moveq    #1,d7
  143. .exit
  144.     move.l    d7,d0
  145.     rts
  146.  
  147. .nocard    lea    (.nocards,pc),a0
  148.  
  149. .perr    move.l    (printf,pc),a2
  150.     jsr    (a2)
  151.     bra.b    .exit
  152.  
  153.  
  154. .nocards    dc.b    'QuickBoot: no Blizzard 12x0 found!',10,0
  155.  
  156.  
  157.     CNOP    0,2
  158. _quickboot_module
  159.  BK_MOD BKMF_SingleMode,_end,(0)<<24+37<<16+NT_UNKNOWN<<8+(256-128),_name,_idstr,_init
  160.  
  161. ; Singlemode on,
  162. ; NEVER INIT module, requires KS V37.x or better, module type NT_UNKNOWN, priority -128.
  163.  
  164. _init    rts
  165.  
  166. _earlycode    ; a6=execbase
  167.     movem.l    d0-d1/d7/a0-a1,-(sp)
  168.  
  169.     lea    (LibList,a6),a0
  170.     lea    (expname,pc),a1
  171.     jsr    (-$84,a6)        ; Forbid
  172.     jsr    (-$114,a6)        ; FindName
  173.     jsr    (-$8a,a6)        ; Permit
  174.     move.l    d0,d7
  175.     beq.b    .noexp
  176.  
  177.     sub.l    a0,a0
  178.     move.w    #$2140,d0
  179.     move.w    (_BoardNum,pc),d1
  180.     exg    d7,a6
  181.     jsr    (-$48,a6)        ; FindCondigDev
  182.     exg    d7,a6
  183.     tst.l    d0
  184.     beq.b    .noexp
  185.  
  186.     move.l    d0,a0
  187.     ;bclr    #ERTB_DIAGVALID,(cd_Rom+er_Type,a0)    ; Don't run init code!
  188.     bclr    #4,(16+0,a0)        ; Don't run init code!
  189. .noexp
  190.     movem.l    (sp)+,d0-d1/d7/a0-a1
  191.     dc.w    $4ef9
  192. jumpaddr    dc.l    $badc0de
  193.  
  194. _BoardNum    dc.w    0
  195.  
  196. expname    dc.b    'expansion.library',0
  197.  
  198. _name
  199. _idstr    dc.b    'QuickBoot.patch',0
  200.     CNOP    0,2
  201. _end
  202.  
  203.  
  204.     CNOP    0,2
  205. table    dc.w    $2140,$11    ; 1230-IV/1240/1260
  206.     dc.w    $2140,$0D    ; 1230-III
  207.     dc.w    $2140,$0B    ; 1230-II
  208.     dc.w    -1
  209.  
  210. regs
  211. rom_size    ds.l    1
  212. rom_phys    ds.l    1
  213. rom_log    ds.l    1
  214. findresident    ds.l    1
  215. installmodule    ds.l    1
  216. printf    ds.l    1
  217.  
  218.  
  219.  
  220.     SECTION    VERSION,DATA
  221.  
  222.     dc.b    '$VER: QuickBoot_PATCH 1.2 (5.8.00)',0
  223.  
  224.